Kojarzenie danych z XML

0

Cześć!
Chciałbym prosić Was o pomoc w dość skomplikowanej rzeczy. Do rzeczy:
Mam plik xml przechowujący informacje jaki lekarz leczy jaką chorobę, przykład:

<ObjectPropertyAssertion>
        <ObjectProperty IRI="#leczy"/>
        <NamedIndividual IRI="#Stomatolog"/>
        <NamedIndividual IRI="#Wada_zgryzu"/>
    </ObjectPropertyAssertion>
    <ObjectPropertyAssertion>
        <ObjectProperty IRI="#leczy"/>
        <NamedIndividual IRI="#Stomatolog"/>
        <NamedIndividual IRI="#Przebarwienie_zębów"/>
    </ObjectPropertyAssertion>
    <ObjectPropertyAssertion>
        <ObjectProperty IRI="#leczy"/>
        <NamedIndividual IRI="#Stomatolog"/>
        <NamedIndividual IRI="#Paradontoza"/>
    </ObjectPropertyAssertion>
    <ObjectPropertyAssertion>
        <ObjectProperty IRI="#leczy"/>
        <NamedIndividual IRI="#Stomatolog"/>
        <NamedIndividual IRI="#Zapalenie_dziąsła"/>
    </ObjectPropertyAssertion>

Potrzebuję

  1. Napisać parser, który pozwoli mi sformatować te dane do takiej postaci aby można było z nich korzystać i nadal każda choroba była przypisana do danej specjalizacji.
  2. Napisać skrypt czy coś w tym rodzaju, który pozwoli na używanie tych danych do wyszukiwania lekarzy po wpisaniu danej choroby, np. Wpiszę w formularz "Wada zgryzu" to ma wyświetlić Stomatolog, wpiszę w formularz "Epilepsja" ma wyświetlić Neurolog itp.

Projekt jest pisany w najnowszym Laravelu dlatego fajnie jakby rozwiązanie można było uzyskać w PHP lub JS (Laravel zapewne nie ma żadnej biblioteki czy coś w tym rodzaju do tego typu rzeczy :( ).

Bardzo proszę o pomoc jak podejść do tego tematu. Zaproponowano mi stworzenie macierzy, gdzie jeden wymiar to choroba, drugi to specjalizacja i gdy się zgadza to na przecięciu dać np. 1 ale nie do końca rozumiem jakbym miał to później wykorzystać.

0

Laravel zapewne nie ma żadnej biblioteki czy coś w tym rodzaju do tego typu rzeczy

Przecież to jest zwyczajny XML - Laravel nie musi nic specjalnego, bo PHP już to ma "wbudowane" (simplexml), nie musisz żadnego parsera pisać.

Bardzo proszę o pomoc jak podejść do tego tematu. Zaproponowano mi stworzenie macierzy, gdzie jeden wymiar to choroba, drugi to specjalizacja i gdy się zgadza to na przecięciu dać np. 1 ale nie do końca rozumiem jakbym miał to później wykorzystać.

Jak dużo masz tych danych? Setki, tysiące, miliony?

1

Danych jest lekko ponad 100. Powiedzmy, że 150 max

W takim wypadku strukturą najprostszą w wykorzystaniu będzie po prostu lista ;-)

Wersja 1:

[
  ['stomatolog', 'wada zgryzu'],
  ['stomatolog', 'przebarwienie zębów'],
  ['stomatolog', 'parodontoza'],
  /* ... */
]

Wersja 2:

[
  'stomatolog' => [
    'wada zgryzu',
    'przebarwienie zębów',
    'parodontoza',
    /* ... */
  ],

  'kardiolog' => [
    /* ... */
  ],

Wersja 3:

[
  'wada zgryzu' => [
    'stomatolog',
    'jakiś inny lekarz',
  ],

  'parodontoza' => [
    'stomatolog',
  ],

  /* ... */
]

Wersja 4 (najbardziej zbliżona do podejścia z dwuwymiarową tablicą):

$lekarze = ['stomatolog', 'jakiś inny lekarz', /* ... */],
$choroby = ['parodontoza', 'wada zgryzu', 'przebarwienie zębów', /* ... */];

$lekarzeChoroby = [
  [true, true, true], // stomatolog (lekarz o indeksie 0) leczy: parodontoza, wada zgryzu, przebarwienie zębów
  [false, false, false], // jakiś inny lekarz (lekarz o indeksie 1) nie leczy nic
];

... i pewnie jeszcze z kilka dałoby się wymyślić :-)

Wersja 2 faworyzuje szukanie po lekarzach (umożliwia szybką odpowiedź na pytanie czym zajmuje się kardiolog?).

Wersja 3 faworyzuje szukanie po chorobach (umożliwia szybką odpowiedź na pytanie kto zajmuje się parodontozą?).

Wersja 1 nie faworyzuje żadnego wyszukiwania, ale za to nie wymaga do działania hashmapy (jest indeksowana liczbami, nie stringami - nie jestem niestety pewien czy w PHP zmienia to wydajność w jakikolwiek znaczący sposób).

Wersja 4 powinna za to zajmować najmniej miejsca w pamięci (ponieważ nie duplikujemy ciągów znaków, tylko operujemy na indeksach).

W przypadku setki danych różnica nie będzie zauważalna, lecz przy np. milionach wpisów, należałoby się solidnie zastanowić nad którymś z rozwiązań (lub dwoma; zauważ, że wykorzystanie wersji 2 + 3 umożliwi szybką odpowiedź na każde pytanie, lecz zajmie dwa razy tyle pamięci).

0

Na wstępie piszę wielkie dzięki!! :)
Użyłem SimpleXML do wczytania zawartości mojego pliku i otrzymałem kod, którego część tu wklejam:

SimpleXMLElement Object
(
    [ObjectPropertyAssertion] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [ObjectProperty] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [IRI] => #cechuje_się
                                )

                        )

                    [NamedIndividual] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [IRI] => #AIDS
                                        )

                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [IRI] => #Ból_głowy
                                        )

                                )

                        )

                )

W jaki sposób mogę odwołać się do tego #cechuje_się? W XML przechowuje info na temat jacy lekarze wyleczą jakie choroby oraz czym dana choroba się cechuje. Chciałbym to teraz sobie rozdzielić na 2 listy właśnie po tej informacji w [IRI]. W jednej liście chciałbym dane z tym [IRI] -> #cechuje_się a w drugiej [IRI] -> #leczy

0

OK, połączyłem dwie listy w pary [lekarz, choroba_którą_leczy]. Zmienna $lekarzeChoroby wygląda tak:

Array
(
    [0] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [0] => #Alergolog
                )

            [1] => SimpleXMLElement Object
                (
                    [0] => #Zapalenie_migdałków
                )

        )

    [1] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [0] => #Alergolog
                )

            [1] => SimpleXMLElement Object
                (
                    [0] => #alergia
                )

        )

    [2] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [0] => #Alergolog
                )

            [1] => SimpleXMLElement Object
                (
                    [0] => #Niedobór_odporności
                )

        )

    [3] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [0] => #Alergolog
                )

            [1] => SimpleXMLElement Object
                (
                    [0] => #AIDS
                )

        )
...
...
...
)

Chciałbym teraz pozbyć się tego SimpleXMLElement Object o ile jest to możliwe :P

0

Dobra, jakoś podołałem temu. Wystarczyło wszystko zrzutować na string jeszcze przed tym całym segregowaniem i rozsyłaniem po tablicach. Obecnie kod wygląda tak:

Array
(
    [0] => Array
        (
            [0] => #Alergolog
            [1] => #Zapalenie_migdałków
        )

    [1] => Array
        (
            [0] => #Alergolog
            [1] => #alergia
        )

    [2] => Array
        (
            [0] => #Alergolog
            [1] => #Niedobór_odporności
        )

    [3] => Array
        (
            [0] => #Alergolog
            [1] => #AIDS
        )

    [4] => Array
        (
            [0] => #Alergolog
            [1] => #HIV
        )

    [5] => Array
        (
            [0] => #Chirurg_klatki_piersiowej
            [1] => #Rak_trzustki
        )

    [6] => Array
        (
            [0] => #Chirurg_klatki_piersiowej
            [1] => #Rak_żołądka
        )
...
...
...
)

Chciałbym teraz poprosić Was o jakiś pomysł jak można takiej listy użyć w mojej wyszukiwarce. Dla przypomnienia:
Trzeba napisać skrypt czy coś w tym rodzaju, który pozwoli na używanie tych danych do wyszukiwania lekarzy po wpisaniu danej choroby, np. Wpiszę w formularz "Wada zgryzu" to ma wyświetlić Stomatolog, wpiszę w formularz "Epilepsja" ma wyświetlić Neurolog itp.

1

No ale na czym się zatrzymałeś?
Cały algorytm to będzie przecież jedna pętla foreach oraz instrukcja warunkowa ;-)

0

Już to w sumie ogarnąłem :) Teraz pozostaje podpięcie tego pod Laravela ale to już chyba wątek na osobny temat :D @Patryk27 dzięki jeszcze raz za pomoc! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1